Interleaved Gradient Noise
#Dithering #ノイズ #乱数生成器 #疑似乱数 #乱数
https://gyazo.com/c7cc0540f62453f6dd15291e80abc9f6
https://gyazo.com/1967561480b0b3956f5e6dd2067cea3a
Source: http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare
Interleaved Gradient Noiseは、乱数とDitheringの中間のように機能する乱数生成器
Quasirandomのようなもの
ピクセルごとにインターリーブしながら、値の勾配が縦横斜めに滑らかになっており、動的なシーンに対する耐性が強い
また、fractと内積のみで実装できるため、パフォーマンスコストも比較的安め
2014年、Next Generation Post Processing in Call of Duty: Advanced Warfareにおいて、シャドウマップのサンプリングをするのに提案された
ポアソンディスクサンプリングを8-tapで試したけど、動いている状況下であんまり品質が良くなかったことから、実験の末にこの手法にたどり着いたとのこと
手法
interleavedGradientNoise 自体の実装は以下の通り
code:glsl
float interleavedGradientNoise(vec2 position) {
vec3 magic = vec3(0.06711056, 0.00583715, 52.9829189);
return fract(magic.z * fract(dot(position, magic.xy)));
}
使う際は、以下のように2次元回転行列のパラメーターとして用いる
code:glsl
sampleOffset = offset * rotate2D(TAU * interleavedGradientNoise(fragCoord));